package ar.com.temporis.framework.domain;

import java.io.Serializable;

import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * Objeto que se diferencia por el valor de sus atributos (que es y no quien
 * es). No se considera su identificacion sino el valor de sus atributos.
 * 
 * @author matias.sulik
 * 
 */
public abstract class ValueObject implements Serializable {

	/**
	 * Escondo la visibilidad para que no pueda identificarse por un id (como si
	 * lo hace {@link Entity}}).
	 */
	@SuppressWarnings("unused")
	protected final Object getId() {
		throw new RuntimeException("Este metodo no debe ser usado.");
	}

	/**
	 * Escondo la visibilidad para que no pueda ser asociado por un
	 * identificador (como si lo hace {@link Entity}}).
	 */
	@SuppressWarnings("unused")
	protected final void setId(Object obj) {
		throw new RuntimeException("Este metodo no debe ser usado.");
	}

	@Override
	public int hashCode() {
		return HashCodeBuilder.reflectionHashCode(this);
	}

	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this,
				ToStringStyle.DEFAULT_STYLE);
	}

}